Why does `javac

您所在的位置:网站首页 javac processor Why does `javac

Why does `javac

2023-04-01 13:40| 来源: 网络整理| 查看: 265

Why does `javac -cp` not need `.`, while `java -cp` does?

Because javac handles files, java handles fully qualified class names.

EDIT

To expand a bit, when youre compiling, youre passing the files you want to compile directly to javac, so the classpath is only meant to contain the packages you need to compile the files youre passing in as argument. That is, the file youre compiling doesnt need to be in the classpath.

On the other hand, when youre executing with java, youre telling the JVM run this class from the classpath. Granted, the default classpath is .. But then you decided to specify a custom classpath with -cp, which does not add to the classpath, but ovverides it. So you have to add it back explicitly.

See the last section of the official tutorial for confirmation.

. being part of the compilers classpath is the result of a couple of things happening implicitly. In order to be able to compile, generated classes referenced in other classes need to be accessible via classpath. So the compiler adds the class-file-destination path to the classpath. If you dont provide anything in particular, that directory is the source-directory. If you dont provide that specifically the process working directory is used which is by default ..

Calling javac -help shows you the different possible settings:

c:Program FilesJavajdk1.8.0_181binjavac.exe -help Usage: javac where possible options include: -g Generate all debugging info -g:none Generate no debugging info -g:{lines,vars,source} Generate only some debugging info -nowarn Generate no warnings -verbose Output messages about what the compiler is doing -deprecation Output source locations where deprecated APIs are used -classpath Specify where to find user class files and annotation processors -cp Specify where to find user class files and annotation processors -sourcepath Specify where to find input source files -bootclasspath Override location of bootstrap class files -extdirs Override location of installed extensions -endorseddirs Override location of endorsed standards path -proc:{none,only} Control whether annotation processing and/or compilation is done. -processor [,,...] Names of the annotation processors to run; bypasses default discovery process -processorpath Specify where to find annotation processors -parameters Generate metadata for reflection on method parameters -d Specify where to place generated class files -s Specify where to place generated source files -h Specify where to place generated native header files -implicit:{none,class} Specify whether or not to generate class files for implicitly referenced files -encoding Specify character encoding used by source files -source Provide source compatibility with specified release -target Generate class files for specific VM version -profile Check that API used is available in the specified profile -version Version information -help Print a synopsis of standard options -Akey[=value] Options to pass to annotation processors -X Print a synopsis of nonstandard options -J Pass directly to the runtime system -Werror Terminate compilation if warnings occur @ Read options and filenames from file

The options I referred to are -s and -sourcepath. -cp is used to define additional locations (directories and library files) where the compiler can look for already compiled classes. Thats also the meaning of -cp when calling java, so there is no contradiction between these two executables.

Why does `javac -cp` not need `.`, while `java -cp` does?


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3